#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <signal.h>
#include <string.h>
#include <sys/epoll.h>
#include "conexiones.h"
#include "estructuras.h"

int conectarSocket(config Conf)
{
	int descriptor;
	int ip=Conf.ip;
	int puerto=Conf.puerto; //LOS SACO DEL ARCHIVO CONFIG

    if ((descriptor = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    struct sockaddr_in *local_address = malloc(sizeof(struct sockaddr_in));

    local_address->sin_family=AF_INET;
    local_address->sin_addr.s_addr=inet_addr(ip);
    local_address->sin_port=htons(atoi(puerto));

    if(connect(descriptor,(struct sockaddr *)&local_address,sizeof(struct sockaddr_in)) == -1)
    {
    	perror("connect");
    }

}

void cargarArrayDeConexiones(config Conf)
{
	int i, cantMaxConexiones;
	cantMaxConexiones=Conf.cantConexiones;
	array_sockets vectorSockets[cantMaxConexiones];

	for(i=0; i<=cantMaxConexiones; i++)
	{
		if((vectorSockets[i].fd=conectarSocket()) != -1)
		{
			vectorSockets[i].estado=A;
		}
	}
}

int liberar(int conexion)
{
	array_sockets vectorSockets[];

	vectorSockets[conexion].estado=I;
}
/*
struct epollfd { //VER COMO LE PUEDO PASAR EL ARCHIVO CONFIG
	int fd;
	short events;
	revents;
  	} array_sock[cantMaxConexiones];

  	int epfd = epoll_create (cantMaxConexiones);
  	struct epoll_events array_sock[cantMaxConexiones];

  	epoll_wait(epfd, array_sock, cantMaxConexiones, timeout);

  	int nfds=epoll_wait(epfd, array_sock, cantMaxConexiones, timeout);

  	for(i=0; i<nfds; i++)
  	{
  		if(array_sock[i].data.fd==fd_1 && array_sock[i].events==socket_libre)
  		{
  			//lo pongo en modo listen
  			//epoll_ctl(epfd, EPOLL_CTL_ADD, fd, array_sock)
  		}
  	}
*/

int efd = epoll_create1 (0);
struct epoll_event event;

event.data.fd = sfd;
event.events = EPOLLIN | EPOLLET;

epoll_ctl (efd, EPOLL_CTL_ADD, sfd, &event);

struct epoll_events array_sock[cantMaxConexiones];

int nfds=epoll_wait(efd, array_sock, cantMaxConexiones, -1);

for(i=0; i<nfds; i++)
{
	 if(array_sock[i].data.fd == sfd)
	 {
		 int client = accept(listener, (struct sockaddr *) &local, &addrlen);

		 event.data.fd = client;
		 event.events = EPOLLIN | EPOLLET;

		 epoll_ctl (efd, EPOLL_CTL_ADD, client, &event);

	 } else if( array_sock[i].events & EPOLLIN ){

		 // Hay un socket listo para lectura

	 }
}
